package com.celesea.framework.service;

import com.celesea.framework.dao.Filter;
import com.celesea.framework.entity.BaseEntity;
import com.celesea.framework.util.Page;
import com.celesea.framework.util.PageData;
import com.celesea.framework.util.Sort;

import java.util.List;

/**
 * @param <T>
 * @author Administrator
 */
public interface BaseService<T extends BaseEntity> {

    /**
     * 通过主键查询对象
     *
     * @param id
     * @return
     */
    T selectById(String id);

    /**
     * 返回新建的对象
     *
     * @return
     */
    T selectForNew();

    /**
     * 查询视图数据
     *
     * @param id
     * @return
     */
    T selectForView(String id);

    /**
     * 保存
     *
     * @param entity
     * @return
     */
    T doSave(T entity);

    /**
     * 插入
     *
     * @param entity
     * @return
     */

    T insert(T entity);

    int insertList(List<T> entitys);

    /**
     * update
     */
    T update(T entity);

    int updateByExample(T entity);

    int updateByExampleSelective(T entity);

    /**
     * 通过主键逻辑删除对象
     *
     * @param id
     */
    int doDelete(String id);

    /**
     * 通过主键物理删除对象
     *
     * @param id
     * @return
     */
    int doRemove(String id);

    /**
     * 通过主键物理删除对象的关联数据
     *
     * @param id
     */
    void doRemoveMapping(String id);

    /**
     * 通过主键逻辑删除对象的关联数据
     *
     * @param id
     */
    void doDeleteMapping(String id);

    /**
     * 批量逻辑删除
     *
     * @param ids
     */
    void doDelete(List<String> ids);

    /**
     * 批量物理删除
     *
     * @param ids
     */
    void doRemove(List<String> ids);

    /**
     * 检查是否唯一
     *
     * @param entity
     * @return 如果唯一返回true，否则返回false
     */
    boolean checkUnique(T entity);

    /**
     * 返回唯一的对象
     *
     * @param entity
     * @return
     */
    T selectUnique(T entity);

    /**
     * 查询分页数据
     *
     * @return
     */
    PageData<T> selectPage(Filter filter, Page page, Sort sort);

    /**
     * 查询列表数据,调用 selectPage 语句 但是不分页
     *
     * @return
     */
    List<T> selectList(Filter filter, Sort sort);

    List<T> selectList(Filter filter);

    /**
     * 查询所有的数据
     *
     * @return
     */
    List<T> selectAll();

    /**
     * 生成Id
     *
     * @return
     */
    T generatPk(T entity);

    /**
     * 生成Id
     *
     * @return
     */
    String generatPk();


}
